package jeudelavie.controleur;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
import jeudelavie.modele.Case;
import jeudelavie.modele.Environnement;
import jeudelavie.modele.Simulateur;
import jeudelavie.vue.CasePanel;
import jeudelavie.vue.Vue;

/**
 *
 * @author epulapp
 */
public class Controleur {

    private Simulateur simulateur;
    private Vue vue;
    private int largeur;
    private int hauteur;
    private boolean clickSouris = false;
    
    //Couleurs
    private Color VieActuelle;
    private Color MortActuelle;
    /**
     * Benshmark *
     */
    boolean isBenshmark;

    /**
     * Constructeurs
     */
    public Controleur() {
        largeur = hauteur = 100;
        vue = new Vue(hauteur, largeur);
        simulateur = new Simulateur(hauteur, largeur);
        
        VieActuelle = Color.red;
        MortActuelle = Color.white;

        //Gestion des observer
        final Environnement environnement = (Environnement) simulateur.getSimulable();
        environnement.addObserver(vue);

        //Gestion des actionListener
        vue.getBtPlayStop().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (simulateur.isIsPlay()) {
                    vue.getBtPlayStop().setLabel("Play");
                    simulateur.pause();
                } else {
                    vue.getBtPlayStop().setLabel("Pause");
                    simulateur.play();
                }
            }
        }); // BtPlayStop

        vue.getBtRestart().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                environnement.Generer();
            }
        });
        
        vue.getBtFeuilleBlanche().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                environnement.FeuilleBlanche();
            }
        });
        
        //Ajout des ActionListeners pour les couleurs
        //Cellules
        vue.getBtCOrange().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.orange;
                vue.setVieActuelle(Color.orange);
                environnement.ForcerUpdate();
            }
        });
        
        vue.getBtCBlanc().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.white;
                vue.setVieActuelle(Color.white);
                environnement.ForcerUpdate();
            }
        });
        
        vue.getBtCBleu().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.blue;
                vue.setVieActuelle(Color.blue);
                environnement.ForcerUpdate();
            }
        });
        
        vue.getBtCRouge().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.red;
                vue.setVieActuelle(Color.red);
                environnement.ForcerUpdate();
            }
        });
        

        for (int i = 0; i < hauteur; i++) {
            for (int j = 0; j < largeur; j++) {
                vue.getTabPan()[i][j].addMouseListener(new MouseListener() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        vieOuMort(e);
                        environnement.ForcerUpdate();

                    }

                    @Override
                    public void mousePressed(MouseEvent e) {
                        clickSouris = true;
                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {
                        clickSouris = false;
                    }

                    @Override
                    public void mouseEntered(MouseEvent e) {

                        if (clickSouris){
                            vieOuMort(e);
                        }
                        environnement.ForcerUpdate();

                    }

                    @Override
                    public void mouseExited(MouseEvent e) {
                      
                    }
                });
            }//for (int j = 0; j < largeur; j++)
        }//for (int i = 0; i < hauteur; i++)




        simulateur.play();
    }//Controleur()

    public void vieOuMort(MouseEvent e) {
        JPanel jp = (JPanel) e.getSource();
        JPanel[][] tabPan = vue.getTabPan();

        for (int i = 0; i < hauteur; i++) {
            for (int j = 0; j < largeur; j++) {
                if (tabPan[i][j] == jp) {
                    Environnement env = (Environnement) simulateur.getSimulable();
                    if (jp.getBackground() != MortActuelle) {
                        jp.setBackground(MortActuelle);
                        env.getCases()[i][j].setEtat(false);
                        env.getCases()[i][j].setCouleur(MortActuelle);
                    } else  { //if (jp.getBackground() == MortActuelle || jp.getBackground() == Color.black) EN COMMENTAIRE A SUPPRIMER PEUT-ETRE PLUS TARD. DEMANDER A QUENTIN.
                        jp.setBackground(VieActuelle);
                        env.getCases()[i][j].setEtat(true);
                        env.getCases()[i][j].setCouleur(VieActuelle);
                    }
                }
                
            }
        }
    }
}//Controleur
